package model

import (
	"fmt"
	"path/filepath"
	"strings"

	"gitee.com/liumou_site/gf"
)

// CheckAndCopyBackup 检查源路径是否存在，并根据目标路径是否存在决定是否进行备份。
// 如果源路径不存在，则返回错误；如果目标路径不存在，则执行备份操作；如果目标路径已存在，则跳过备份。
// 返回值：
//   - error: 如果源路径不存在或备份过程中发生错误，则返回相应的错误信息；否则返回nil。
func (i Info) CheckAndCopyBackup() error {
	if i.Debug {
		GetLanguageManager().Debug("开始检查并备份", "Start checking and backing up")
	}
	// 获取源地址最后一个路径单词
	lastWord := strings.Split(i.Source, "/")[len(strings.Split(i.Source, "/"))-1]
	dst := filepath.Join(i.Target, lastWord)
	f := gf.NewFile(i.Source)
	f.IsDir()
	f.Exists()
	// 检查源路径是否存在
	if !f.IsDirs {
		GetLanguageManager().Error("源路径不存在: ", "The original path does not exist: ", i.Source)
		return fmt.Errorf("the original path does not exist: %s", i.Source)
	}
	f.FileName = dst
	f.IsDir()
	f.Exists()
	// 检查目标路径是否存在，并根据情况决定是否进行备份
	if !f.IsDirs {
		GetLanguageManager().Info("目标路径不存在，开始备份: ", "The target path does not exist, start backup: ", dst)
	} else {
		GetLanguageManager().Info("目标路径已存在，跳过备份: ", "The target path already exists, skip backup: ", dst)
		return nil
	}
	i.Cmd.RunShell("mkdir", "-p", i.Target)
	if i.Cmd.Err != nil {
		GetLanguageManager().Error("创建目标目录失败: ", "Failed to create target directory: ", i.Target)
		return fmt.Errorf("failed to create target directory: %s", i.Target)
	}
	// 使用shell命令复制源路径内容到目标路径
	cmd := "cp -rf " + i.Source + " " + dst
	i.Cmd.RunShell(cmd)
	if i.Cmd.Err != nil {
		GetLanguageManager().Error("复制源路径到目标路径失败: ", "Failed to copy source path to target path: ", dst)
		return fmt.Errorf("failed to copy source path to target path: %s", dst)
	}

	GetLanguageManager().Info("备份成功完成: ", "Backup completed successfully: ", dst)
	return i.Cmd.Err
}
